#!/usr/bin/env python3
import time
import gpiod
import threading

# --- 1. 硬件初始化 ---
# 定义LED连接的GPIO引脚和控制器
led1_pin = 16  # 蓝色led
try:
    chip = gpiod.Chip('gpiochip4')
    led1 = chip.get_line(led1_pin)
    led1.request(consumer="led1", type=gpiod.LINE_REQ_DIR_OUT)
except Exception as e:
    print(f"GPIO初始化失败: {e}")
    print("请确保您在正确的硬件上运行，并且gpiod库已安装。")
    # 创建一个虚拟led对象，以便在没有硬件的PC上测试逻辑
    class MockLed:
        def set_value(self, value):
            state = "亮" if value == 0 else "灭"
            # 使用\r和end=''实现单行刷新，避免刷屏
            print(f"\r[模拟LED状态]: {state}   ", end='')
    led1 = MockLed()


# --- 2. 状态控制的全局变量 ---
# 主线程通过修改这两个变量来“命令”LED线程如何闪烁
# 单位: 10毫秒 (因为led_thread中sleep(0.01))
led_on_time = 50   # LED亮的时间
led_off_time = 50  # LED灭的时间


# --- 3. LED控制线程函数 ---
# 这个函数在独立的线程中无限循环，是闪烁效果的“执行者”
def led_thread():
    """
    该线程不关心任何业务逻辑，它只做一件事：
    根据全局变量 led_on_time 和 led_off_time 的值来控制LED的亮灭。
    """
    global led_on_time
    global led_off_time
    
    local_led_on_time = 0
    local_led_off_time = 0

    count = 0
    cycle_time = 0
    while True:
        # 当主线程修改了全局变量后，在这里更新本地变量
        if local_led_on_time != led_on_time or local_led_off_time != led_off_time:
            local_led_on_time = led_on_time
            local_led_off_time = led_off_time
            cycle_time = local_led_on_time + local_led_off_time # 计算一个完整的亮灭周期
            count = 0 # 重置计数器
        
        # 如果一个周期为0（例如常亮或常灭），则不做任何操作
        if cycle_time == 0:
            led1.set_value(0 if local_led_on_time > 0 else 1)
            time.sleep(0.1) # 避免CPU空转
            continue

        # 在一个周期内，根据count值决定是亮还是灭
        if count < local_led_on_time:
            # 亮灯阶段 (0代表亮)
            led1.set_value(0)
            count += 1
        elif count < cycle_time:
            # 灭灯阶段 (1代表灭)
            led1.set_value(1)
            count += 1
        else:
            # 一个周期结束，重置计数器
            count = 0

        # 循环的基本时间单位，每次循环间隔10毫秒
        time.sleep(0.01)

# --- 4. 主程序入口 ---
if __name__ == "__main__":
    
    print("LED闪烁控制程序已启动。")
    print("主线程将每5秒模拟一次网络状态变化...")

    # 启动LED控制线程，让它在后台开始工作
    led_controller_thread = threading.Thread(target=led_thread, daemon=True)
    led_controller_thread.start()

    try:
        # 这个循环模拟了主程序（如WIFI_MGR）根据不同网络状态
        # 来修改全局变量的行为。
        while True:
            # 状态1: 模拟AP模式 (均匀闪烁)
            print("\n模拟状态: AP模式 (均匀闪烁)")
            led_on_time = 50  # 亮 50 * 10ms = 0.5s
            led_off_time = 50 # 灭 50 * 10ms = 0.5s
            time.sleep(5)

            # 状态2: 模拟Client模式正在连接 (快速闪烁)
            print("\n模拟状态: 正在连接WiFi (快速闪烁)")
            led_on_time = 5   # 亮 5 * 10ms = 0.05s
            led_off_time = 5  # 灭 5 * 10ms = 0.05s
            time.sleep(5)

            # 状态3: 模拟Client模式连接成功 (常亮)
            print("\n模拟状态: WiFi连接成功 (常亮)")
            led_on_time = 100 # 亮 100 * 10ms = 1s
            led_off_time = 0  # 灭 0s
            time.sleep(5)

    except KeyboardInterrupt:
        # 捕捉Ctrl+C中断，准备退出
        print("\n程序准备退出...")
    finally:
        # 程序退出前，确保LED熄灭
        led1.set_value(1)
        print("LED已熄灭，程序结束。")